#ifndef __MVS_MSAL_PORTING_H__
#define __MVS_MSAL_PORTING_H__

#include "mvdef.h"

MVCXX_EXTERN_BEGIN

#include "mvs_core/mvs_core_porting.h"
/*******************************
 *   平台适配接口(msal_porting)
 ******************************/
/**
 * @brief 获取支持的画质通道(bitmap)
 * 
 * @param u8_dchn [in]  设备通道
 * @return 画质通道(bitmap) [mvspt_vquality_e]
 */
mv_s32_t mvspt_msal_valid_vqlty(mv_u8_t u8_dchn);
/**
 * @brief 获取画质通道对应的MS通道号
 * 
 * @param e_vqlty [in] 画质通道[mvspt_vquality_e]
 * @return 获取结果
 * - success : 对应的MS通道号
 * -  failed : < 0
 */
mv_s32_t mvspt_msal_vqlty_to_mschn(mvspt_vquality_e e_vqlty);
/**
 * @brief 获取画质通道对应的宏视全景校准参数
 * 
 * @param e_vqlty       [in]  画质通道[mvspt_vquality_e]
 * @param pu8_pano_type [out] 全景类型; 0=普通; 1=挂壁(180°); 2=吸顶(360°)
 * @param pu32_pano_x   [out] 全景圆心X坐标
 * @param pu32_pano_y   [out] 全景圆心Y坐标
 * @param pu32_pano_r   [out] 全景圆半径
 * @return 获取结果
 * - success : MV_EC_SUCCESS
 * -  failed : < 0 
 */
mv_s32_t mvspt_msal_vqlty_pano_spec(mvspt_vquality_e e_vqlty, mv_u8ptr_t pu8_pano_type, mv_u32ptr_t pu32_pano_x, mv_u32ptr_t pu32_pano_y, mv_u32ptr_t pu32_pano_r);
/**
 * @brief 返回录像存储路径根目录挂载的mmc节点
 * 
 * @param u8_dchn [in]  设备通道
 * @return 录像存储路径根目录所挂载mmc节点
 */
mv_cv8ptr_t mvspt_msal_rec_mmcblk(mv_u8_t u8_dchn);
/**
 * @brief 返回录像存储路径根目录
 * 
 * @param u8_dchn [in]  设备通道
 * @return 录像存储路径根目录 
 */
mv_cv8ptr_t mvspt_msal_rec_rootdir(mv_u8_t u8_dchn);
/**
 * @brief 返回录像播放最大帧大小限制
 * 
 * @param u8_dchn [in]  设备通道
 * @return 最大帧大小限制值（字节） 
 */
mv_s32_t    mvspt_msal_recplay_maxframe(mv_u8_t u8_dchn);
/**
 * @brief 返回当前时区与UTC0的偏差值（秒）
 * 
 * @param u8_dchn [in]  设备通道
 * @return 偏差值（毫秒） 
 * 
 * @attention 此接口返回非0，会影响到录像和搜索日期结果与时区绑定；
 *            当切换时区后，会出现搜索结果可能与理想结果不一致情况，因为无法处理时区切换前已存在文件的换算，属于正常现象！！！
 */
mv_s32_t    mvspt_msal_rec_tz_diff(mv_u8_t u8_dchn);
/**
 * @brief 返回当前DST偏差值（秒）
 * 
 * @param u8_dchn [in]  设备通道
 * @return 偏差值（毫秒） 
 * 
 * @attention 此接口返回非0，会影响到录像日期结果；
 *            当切换DST状态后，会出现搜索结果可能与理想结果不一致情况，因为无法处理DST切换前已存在文件的换算，属于正常现象！！！
 */
mv_s32_t    mvspt_msal_rec_dst_diff(mv_u8_t u8_dchn);
/*******************************
 *         msal模块接口
 ******************************/

typedef enum _msal_rec_etype
{
    MSAL_REC_ETYPE_NONE           = 0,    ///< 无效事件
    MSAL_REC_ETYPE_MOTION         = 1,    ///< 移动事件
    MSAL_REC_ETYPE_PIR            = 2,    ///< PIR事件
    MSAL_REC_ETYPE_PERSON         = 3,    ///< 人形事件
    MSAL_REC_ETYPE_DOORBELL       = 4,    ///< 门铃事件
    MSAL_REC_ETYPE_SMOKE          = 5,    ///< 烟感事件
    MSAL_REC_ETYPE_BABYCRY        = 6,    ///< 婴儿哭声事件
    MSAL_REC_ETYPE_PERSON_STAY    = 7,    ///< 人员逗留事件
    MSAL_REC_ETYPE_ALARM_AREA     = 8,    ///< 区域报警事件
    MSAL_REC_ETYPE_POSITIVE_ALARM = 9,    ///< 主动报警事件

    MSAL_REC_ETYPE_NUM,
    MSAL_REC_ETYPE_END         = (MSAL_REC_ETYPE_NUM-1),
}mvs_msal_rec_etype_e;

/** #ifdef MSAL_REC_MODULE */
#define MSAL_REC_MAX_DURATION  600      ///< 最大录像时长限制值为小于等于600, 因为大于此时长的文件对内存压力较大，抗损坏能力也较差

typedef struct _msal_rec_cfg
{
    mv_s32_t   s32_duration_min_ms;     ///< 单个录像文件最小录像时长（毫秒；每次事件触发刷新时长）
    mv_s32_t   s32_duration_max_ms;     ///< 单个录像文件最大录像时长（毫秒）
    mv_u16_t   u16_summary_interval;    ///< 浓缩录像模式浓缩间隔(秒)
    mv_u16_t   u16_summary_duration_max;///< 单个录像文件最大浓缩时长(秒；不大于600)
    mv_ssize_t sz_del_trigger_thr;      ///< 循环录制模式下的录像删除触发阈值（字节）
    mv_u8_t    u8_rebuild_last;         ///< 是否启用最后一个异常中断录像的重建尝试
    mv_bool_t  bl_rec_audio;            ///< MV_FALSE=录像无音频, MV_TRUE=录像带音频
    mv_u8_t    u8_rec_mode;             ///< 录像模式,[mvspt_recfile_rt_e]组合位图
    mv_bool_t  bl_cycle;                ///< MV_FALSE=满盘停止, MV_TRUE=自动覆盖最旧录像
    mv_u8_t    u8_vqlty;                ///< 录像视频质量类型
    mv_u8_t    u8_fatal_err_thr;        ///< 指定连续异常累计出现次数，会报出严重异常（0=不生效）; MV_EC_FATAL_ERROR
}mv_msal_rec_cfg_t;
mv_s32_t    mvs_msal_rec_init   (mv_u8_t u8_dchn, mv_msal_rec_cfg_t *p, mv_u8ptr_t pu8_cancel);
mv_s32_t    mvs_msal_rec_uninit (mv_u8_t u8_dchn, mv_s32_t s32_await_ms);
mv_s32_t    mvs_msal_rec_resume (mv_u8_t u8_dchn);
mv_s32_t    mvs_msal_rec_suspend(mv_u8_t u8_dchn, mv_s32_t s32_await_ms);
mv_s32_t    mvs_msal_rec_systime_updated  (mv_u8_t u8_dchn); ///< 系统时间刷新时，调用通知录像模块相应处理
mv_s32_t    mvs_msal_rec_event_trigger    (mv_u8_t u8_dchn, mvs_msal_rec_etype_e e_etype);
mv_s32_t    mvs_msal_rec_prop_vqlty_change(mv_u8_t u8_dchn, mv_u8_t   u8_vqlty);    ///< 录像视频质量类型
mv_s32_t    mvs_msal_rec_prop_mode_change (mv_u8_t u8_dchn, mv_u8_t   u8_rec_mode); ///< 录像模式,[mvspt_recfile_rt_e]组合位图
mv_s32_t    mvs_msal_rec_prop_cycle_change(mv_u8_t u8_dchn, mv_bool_t bl_cycle, mv_ssize_t sz_del_trigger_thr);    ///< 是否循环录像
mv_s32_t    mvs_msal_rec_prop_audio_change(mv_u8_t u8_dchn, mv_bool_t bl_sw);       ///< MV_FALSE=录像无音频, MV_TRUE=录像带音频
mv_s32_t    mvs_msal_rec_seg_state        (mv_u8_t u8_dchn, mv_time_t ts_fts_ms_utc0);      ///< 录像文件状态获取
mv_s32_t    mvs_msal_rec_seg_lock_ctrl    (mv_u8_t u8_dchn, mv_time_t ts_fts_ms_utc0, mv_bool_t bl_lock); ///< 录像文件锁定/解锁
mv_s32_t    mvs_msal_rec_seg_delete       (mv_u8_t u8_dchn, mv_time_t ts_fts_ms_utc0, mv_bool_t bl_force); ///< 录像文件删除

mv_s32_t    mvspt_msal_rec_err_occured    (mv_u8_t u8_dchn, mv_s32_t  s32_result, mv_v8ptr_t pv8_msg); ///< MV_EC_IO_ERROR时建议重载sd卡处理; MV_EC_FATAL_ERROR时建议对sd卡进行人工处理
mv_s32_t    mvspt_msal_rec_sig_osd        (mv_u8_t u8_dchn, mv_bool_t bl_sw);       ///< MV_TRUE=显示，MV_FALSE=隐藏
mv_s32_t    mvspt_msal_rec_low_capacity   (mv_u8_t u8_dchn, mv_bool_t bl_state);    ///< 当录像模块无法处理保持剩余空间在删除阈值之上，导致无法录像，则会通知低容量状态(MV_TRUE); 否则为(MV_FALSE)
/** #endif */
/**
 * @brief 获取磁盘信息
 * 
 * @param u8_dchn           [in]  设备通道
 * @param pu32_cluster_size [out] 返回簇大小(字节)
 * @return FAT类型
 * - success : 1=FAT32；2=EXFAT
 * -  failed : else 
 */
mv_s32_t    mvs_msal_rec_disk_info  (mv_u8_t u8_dchn, mv_u32ptr_t pu32_cluster_size);
/**
 * @brief FAT32文件系统磁盘格式化（针对已经是FAT32格式的分区）
 * 
 * @param u8_dchn            [in] 设备通道
 * @param u8_cluster_size    [in] 簇大小（字节，可选值0=原始，8*1024，16*1024，32*1024）
 * @return 格式化结果
 * - success : MV_EC_SUCCESS
 * -  failed : MV_EC_NOT_SUPPORT (非FAT32格式)
 *             else
 */
mv_s32_t    mvs_msal_rec_disk_format(mv_u8_t u8_dchn, mv_u32_t u32_cluster_size);

MVCXX_EXTERN_END

#endif
